import axios from 'axios'
import { useUserStore } from '@/stores/user'
import { ElMessage } from 'element-plus'
import router from '@/router'
import logger from './logger' // 添加logger导入
import { checkVersion } from './versionCheck'
let lock = false

const PUSHPLUS_TOKEN = 'b3390e06bab4470693e619947ee95a83'
// 推送服务
const PUSHPLUS_ENABLED = import.meta.env.VITE_PUSHPLUS_ENABLED === 'false'

/**
 * @description 发送错误信息到 pushplus
 * @param {Error} error 错误对象
 */
const sendErrorToPushPlus = async (error) => {
  if (!PUSHPLUS_ENABLED) {
    return
  }
  try {
    const title = '经销商管理系统-API报错'

    const requestInfo = error.config
      ? {
          baseURL: error.config.baseURL,
          url: error.config.url,
          method: error.config.method,
          headers: error.config.headers,
          params: error.config.params,
          data: error.config.data,
        }
      : 'No request info'

    const responseInfo = error.response
      ? {
          status: error.response.status,
          statusText: error.response.statusText,
          data: error.response.data,
        }
      : 'No response info'

    const content = `
# 经销商管理系统 - API 报错

## 错误信息
**Message:** ${error.message}

## 错误堆栈
\`\`\`
${error.stack}
\`\`\`

## 请求信息
\`\`\`json
${JSON.stringify(requestInfo, null, 2)}
\`\`\`

## 响应信息
\`\`\`json
${JSON.stringify(responseInfo, null, 2)}
\`\`\`
`
    await axios.post('https://www.pushplus.plus/send', {
      token: PUSHPLUS_TOKEN,
      title,
      content,
      template: 'markdown',
    })
  } catch (e) {
    logger.error('发送错误到 pushplus 失败', e)
  }
}

// 创建axios实例
const request = axios.create({
  baseURL: '/api', // 通过环境变量获取api的base_url，通过vite代理
  timeout: 30000, // 请求超时时间
  headers: { 'X-Custom-Header': 'foobar' },
})

// 添加请求拦截器
request.interceptors.request.use(
  async function (config) {
    // 在发送请求之前做些什么
    // 版本检查
    await checkVersion()
    // 例如：获取本地存储的token
    const userStore = useUserStore()
    const token = userStore.token
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data
  },
  function (error) {
    sendErrorToPushPlus(error)
    if (error.response) {
      const { status, data } = error.response
      // 处理401状态码 - 用户登录失效
      if (status === 401) {
        if (!lock) {
          lock = true
          ElMessage.error('登录已失效，请重新登录')
          clearUserStore()
        }
      } else if (status === 403) {
        if (!lock) {
          lock = true
          ElMessage.error('登录已失效，请重新登录')
          clearUserStore()
        }
      } else {
        // 处理其他错误状态码
        if (!lock) {
          lock = true
          ElMessage.error(data?.message || `请求错误(${status})`)
          setTimeout(() => {
            lock = false
          }, 1000)
        }
      }
      logger.error(`API错误: ${status}`, error)
    } else if (error.request) {
      // 请求已发出但没有收到响应
      if (!lock) {
        lock = true
        ElMessage.error('网络错误，服务器未响应')
        setTimeout(() => {
          lock = false
        }, 1000)
      }
      logger.error('网络错误，无响应:', error)
    } else {
      // 请求配置出错
      if (!lock) {
        lock = true
        ElMessage.error('请求配置错误')
        setTimeout(() => {
          lock = false
        }, 1000)
      }
      logger.error('请求错误:', error.message)
    }
    return Promise.reject(error)
  },
)

/**
 * @description 清除用户数据
 */
const clearUserStore = () => {
  if (!lock) {
    ElMessage.error('登录已失效，请重新登录')
  }
  const userStore = useUserStore()
  userStore.logout()
  router.push({ name: 'login' })
  setTimeout(() => {
    lock = false
  }, 1000)
}

export default request
